#include <iostream> // 输入输出流
#include <string>   // 字符串处理（本程序未使用）
#include <cmath>    // 数学函数库（本程序未使用）


using namespace std;
typedef long long ll; // 定义 long long 类型别名为 ll，用于支持大整数运算
const int N = 100000007; // 模数，用于取模防止数值溢出
ll dp[1000010]; // 动态规划数组，dp[i] 表示某种组合数（具体见下文解释）


int main() {
    int n, a, b;
    ll s; // 使用 long long 避免溢出
    cin >> n >> s >> a >> b; // 输入四个参数：n, s, a, b

    int max_sum = n * (n - 1) / 2; // 最大的可能组合和（用于后续循环）

    dp[0] = 1; // 初始化动态规划数组：和为0的组合方式有1种

    // 构建组合数 dp[j]
    // 这个部分是一个经典的背包问题变形：
    // 从1到n-1中选若干不同的数，使得它们的和等于j
    for (int i = 1; i <= n - 1; ++i) {
        for (int j = (i + 1) * i / 2; j >= i; --j)
		{
            dp[j] += dp[j - i]; // 背包递推公式
            dp[j] %= N;         // 取模防止溢出
        }
    }

    // 计算 low：表示一个初始偏移量
    ll low = -max_sum * (ll)a + s;

    int cnt = 0; // 用于统计符合条件的解的数量
    ll f = low % n;       // 初始偏移对 n 取模
    ll q = (a + b) % n;   // a + b 对 n 取模

    // 遍历所有可能的组合和 i
    for (int i = 0; i <= max_sum; i++) {
        // 判断 (low + (a + b)*i) 是否能被 n 整除
        if (((ll)i * q + f) % (ll)n == 0) {
            cnt += dp[i]; // 如果满足条件，则加上对应的组合数
            cnt = cnt % N; // 取模防止溢出
        }
    }

    cout << cnt; // 输出最终结果
    return 0;
}